package org.jwflow.design.base;

import freemarker.template.Configuration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {

    public Configuration cfg;//freemarker的配置类
    @Override
    public void init() throws ServletException {
        //在初始化Servlet的时候就做的事情：
        cfg = new Configuration();//创建freemarker配置实例
        //指定freemarker的上下文环境和模板路径：
        cfg.setServletContextForTemplateLoading(
                getServletContext(), "templates");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取参数, 用来识别用户想请求的方法
        String methodName = req.getParameter("method");

        // 判断该参数是否存在, 不存在,抛出异常
        if(methodName == null || methodName.trim().isEmpty()){
            throw new RuntimeException("您没有传递 method 参数! 无法确定您想调用的方法");
        }

        // 得到当前类的 class 对象
        Class c = this.getClass();

        // 查询方法, 参数需要: 方法名和该方法的参数类型
        // 该方法的参数类型必须与 service 中的参数类型一致
        Method method = null;
        try{
            method = c.getMethod(methodName,
                    HttpServletRequest.class, HttpServletResponse.class);
        } catch(Exception e){
            throw new RuntimeException("您要调用的方法"+methodName+",它不存在!");
        }

        // 调用 method 方法
        // 反射调用, 第一参数表示当前类,
        // 正常调用: this.method(req,resp)
        try{
            method.invoke(this,req,resp);
        } catch(Exception e){
            throw new RuntimeException(e);
        }
    }

}
